枚举
例如材质中的BlendMode枚举代码如下:
UENUM(BlueprintType)
enum EBlendMode
{
BLEND_Opaque UMETA(DisplayName="Opaque"),
BLEND_Masked UMETA(DisplayName="Masked"),
BLEND_Translucent UMETA(DisplayName="Translucent"),
BLEND_Additive UMETA(DisplayName="Additive"),
BLEND_Modulate UMETA(DisplayName="Modulate"),
BLEND_AlphaComposite UMETA(DisplayName = "AlphaComposite (Premultiplied Alpha)"),
BLEND_AlphaHoldout UMETA(DisplayName = "AlphaHoldout"),
BLEND_MAX,
};
UMETA以及其他诸如UPROPERTY之类的宏,其定义都是如下:
#define UPROPERTY(...)
这意味着这这些宏可以接受任意参数,且什么都不做。因为这是给Unreal Header Tool的标记,UHT会读取到宏中的参数来进行操作,例如提供反射、提供元信息。 上面的UMETA(DisplayName="Opaque")是为材质编辑器或蓝图或其他接口提供元信息,而如果想对枚举进行序列化反序列化支持,那么就需要用如下的方法:
UCLASS(hidecategories=Object, MinimalAPI, BlueprintType)
class UMaterial : public UMaterialInterface
{
GENERATED_UCLASS_BODY()
...
TEnumAsByte<enum EBlendMode> BlendMode;
...
}
TEnumAsByte把枚举以uint8的格式进行存储。但是官方建议现在使用继承自uint8_t的enum class,能有一样的效果。